函數(shù)式編程
2022-09-01 16:27:52
我在Java中玩了一些練習(xí)問題。我為下面給出的程序編寫了一個(gè)遞歸程序。我的解決方案是正確的,除了掛起(我相信)恢復(fù)到活動(dòng)狀態(tài)并更改遞歸方法的值。我還在調(diào)試模式下添加了 Eclipse 的屏幕截圖,其中顯示了線程堆棧。package com.nix.tryout.tests;/** * For given two numbers A and B such that 2 <= A <= B, * Find most number of sqrt operations for a given number such that square root of result is a whole number and it is again square rooted until either the * number is less than two or has decimals. * example if A = 6000 and B = 7000, sqrt of 6061 = 81, sqrt of 81 = 9 and sqrt of 9 = 3. Hence, answer is 3 * * @author nitinramachandran * */public class TestTwo { public int solution(int A, int B) { int count = 0; for(int i = B; i > A ; --i) { int tempCount = getSqrtCount(Double.valueOf(i), 0); if(tempCount > count) { count = tempCount; } } return count; } // Recursively gets count of square roots where the number is whole private int getSqrtCount(Double value, int count) { final Double sqrt = Math.sqrt(value); if((sqrt > 2) && (sqrt % 1 == 0)) { ++count; getSqrtCount(sqrt, count); } return count; } public static void main(String[] args) { TestTwo t2 = new TestTwo(); System.out.println(t2.solution(6550, 6570)); }} 上面的屏幕截圖來自我的調(diào)試器,我已經(jīng)圈出了線程堆棧。任何人都可以嘗試運(yùn)行該程序,并讓我知道問題是什么以及解決方案是什么?我可以想出一個(gè)非遞歸解決方案。
2 回答

寶慕林4294392
TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
你的代碼是錯(cuò)誤的,你應(yīng)該有
return getSqrtCount(sqrt, count);
而不是
getSqrtCount(sqrt, count);
否則,遞歸是毫無意義的,你完全忽略了遞歸的結(jié)果。

繁星淼淼
TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
您的遞歸是錯(cuò)誤的,因?yàn)?在任何情況下,或者即使它深入到遞歸調(diào)用中,也會(huì)返回 的值。Java是按值傳遞的,這意味著修改方法內(nèi)部的基元的值在該方法之外將不可見。為了糾正這一點(diǎn),我們可以編寫以下遞歸:count01
private int getSqrtCount(Double value) {
final Double sqrt = Math.sqrt(value);
if((sqrt > 2) && (sqrt % 1 == 0)) {
return getSqrtCount(sqrt) + 1;
}
return 0;
}
添加回答
舉報(bào)
0/150
提交
取消