Power BI is turning 10! Tune in for a special live episode on July 24 with behind-the-scenes stories, product evolution highlights, and a sneak peek at what’s in store for the future.
Save the dateEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
Hi Experts!
I need to implement a fairly simple root finding algorithm in a DAX measure. E.g.
F[X(i+1)] = X(i) - F[X(i)] / F'[X(i)]
with the ability to loop until a convergence criteria is met e.g. ABS( F[X(i+1)] - F[X(i)] ) < 0.001. However, I am uncertain if DAX is capable if implementing loops.
Has anyone ever implemented such an algorithm and how did you go about doing so?
Thanks in advance!
Solved! Go to Solution.
Hi @Deku,
I did a little research and according to Russo and Ferrari, DAX does not support full recursion. It supports something called sideways recursion, but the details of that are unclear and based on what I can tell don't apply here anyway. Apparently, MDX supports full recursion, but MS left it out of DAX for performance reasons.
I also saw Greg Deckler's post on For Loops which is helpful, but again falls short when one requires full recursion. He has an example for the Fibonacci series, but it is hack versus an actual solution.
PowerQuery is not an option either because this is a user interaction requirement.
All this brings me to my final point.
I have been using PBI over a year now, and while DAX/Vertipaq are powerful tools, in my estimation, the lack of full recursion puts PBI plainly in the category of a reporting tool only which severely handicaps its potential applications. And, I think developers need to be aware of this before considering using PBI for anything other than reporting.
I believe I can still cook up a workaround that follows Greg Deckler's Fibonacci series example, but I am not 100% certain, and it will certainly be a compromise at the end of the day.
Anyway, I am marking this reply as the solution unless someone comes in with another.
You can perform loops by using generateseries() to tuple of values which you can iterate with addcolumns(). I think you want to pass the value from each iteration into the next, which I don't think is possible
@Deku Thank you for your insightful reply.
If I understand correctly, this requirement isn't possible using DAX?
I believe so. Might be possible in powerquery
Hi @Deku,
I did a little research and according to Russo and Ferrari, DAX does not support full recursion. It supports something called sideways recursion, but the details of that are unclear and based on what I can tell don't apply here anyway. Apparently, MDX supports full recursion, but MS left it out of DAX for performance reasons.
I also saw Greg Deckler's post on For Loops which is helpful, but again falls short when one requires full recursion. He has an example for the Fibonacci series, but it is hack versus an actual solution.
PowerQuery is not an option either because this is a user interaction requirement.
All this brings me to my final point.
I have been using PBI over a year now, and while DAX/Vertipaq are powerful tools, in my estimation, the lack of full recursion puts PBI plainly in the category of a reporting tool only which severely handicaps its potential applications. And, I think developers need to be aware of this before considering using PBI for anything other than reporting.
I believe I can still cook up a workaround that follows Greg Deckler's Fibonacci series example, but I am not 100% certain, and it will certainly be a compromise at the end of the day.
Anyway, I am marking this reply as the solution unless someone comes in with another.
Sideways recursion is referencing calculation items from calaculation items in the same calculation group
Check out the July 2025 Power BI update to learn about new features.
This is your chance to engage directly with the engineering team behind Fabric and Power BI. Share your experiences and shape the future.
User | Count |
---|---|
65 | |
63 | |
52 | |
39 | |
25 |
User | Count |
---|---|
84 | |
57 | |
45 | |
44 | |
37 |