递归幂运算程序中np()函数返回1.#QUAN0而非实际值的问题
问题分析与修复
核心问题:递归函数未返回递归调用结果
你的pp和np函数在else分支中,执行递归调用后没有返回该调用的结果。这会导致函数执行到末尾时没有明确的return语句,返回的是未定义的垃圾值——不同编译器、运行环境对这种情况的处理不同,这就是为什么在你电脑上负幂出现1.#QUAN0(实际是NaN,非法数值),而学长电脑能运行的原因。
比如np函数的else分支:
m *= (1/i); np(i,j+1,m); // 这里没有return np(...)的结果!
当j不等于0时,函数执行完递归调用后,没有返回值,栈里的返回值是随机的,最终触发NaN输出。
修复方案
给两个函数的else分支加上return语句,返回递归调用的结果即可解决问题:
修复后的完整代码
#include <stdio.h> int pp(int i, int j, int m) { if(j==0) return m; else { m *= i; return pp(i,j-1,m); // 新增return返回递归结果 } } float np(float i,int j,float m) { if(j==0) return m; else { m *= (1/i); return np(i,j+1,m); // 新增return返回递归结果 } } int main() { int i; int j; printf("Enter the value of i="); scanf("%d",&i); printf("Enter the value of j="); scanf("%d",&j); if(j>=0) printf("%d",pp(i,j,1)); else printf("%f",np((float)i,j,(float)1)); return 0; }
额外说明
1.#QUAN0是编译器对**NaN(非数值)**的打印形式,通常出现在使用未定义的数值时;- 你的递归逻辑本身是正确的:正幂通过j递减到0累加乘积,负幂通过j递增到0累乘倒数,仅缺少返回递归结果的关键步骤。
内容的提问来源于stack exchange,提问作者Vikryansh Singh
相关产品推荐
相关产品推荐

